<?php
/**
 * b2b168 网站文章发布系统
 */

//**** 初始化一些目录信息 ****//

define('ROOT_PATH', dirname(__FILE__) . '/');
define('LIB_PATH', ROOT_PATH . 'lib/');
define('POST_URL_KEY_LIST', ROOT_PATH . 'postUrlKeyList/');//保存已发布的文章的链接和关键词的目录（标题）
define('POST_KEY_LOG', ROOT_PATH . 'keyLog/');//保存已发布过的关键词的目录

//**** 引用类库信息 ****//
require LIB_PATH . 'lib.functions.php';  // 导入类库方法(公共)
require LIB_PATH . 'b2b168.Class.php';   // 导入功能方法(自用)
require ROOT_PATH . 'config.php';         // 引入配置信息

// 初始化发布列队
$processList = array();

//**** 执行流程 ****//
$printStr = sprintf("==八方网发文章系统==\n启动时间: %s\n进程ID:%s\n\n", date('Y-m-d H:i:s'), posix_getpid());
print_f($printStr);


//==========================================百度推送======================================
// 主动将前一天发布的文章链接推送给百度
$day = "昨天";
// print_f("检查{$day}的连接并主动推送到百度...\n");
// foreach ($userList as $userName => $userInfo) {

    // // 获取最近4页的所有连接 并推送到百度
    // $date = date("Y-m-d", strtotime("-1 day"));
    // $all_list = getPostUrlList($userName, $date);
    // if (!$all_list) {
        // print_r("获取{$day}的文章链接【失败】!!!\n");
        // continue;
    // }

    // // 执行百度推送
    // $ret = do_baiduPush($all_list, $userName, $day, $date);
    // if ($ret) continue;
// }
//==========================================百度推送======================================

// 初始化登录每个账号
print_f("共导入账号 " . count($userList) . " 个，登录中...\n");
foreach ($userList as $userName => $userInfo) {
    print_f("登录账号 {$userName} ...");

    // 初始化创建对象
    $userList[$userName]['b2bObj'] = new b2b168($userInfo['userName'], $userInfo['userPass']);

    // 检查初始是否成功
    if ($userList[$userName]['b2bObj']->getErrorMsg() == 'NotLogin') {
        if (!$userList[$userName]['b2bObj']->userLogin()) {
            // 登录失败
            print_f("登录失败: " . $userList[$userName]['b2bObj']->getErrorMsg() . "\n");
            // 删除本对象
            unset($userList[$userName]);
        } else {
            $userList[$userName]['b2bObj']->saveCookie();
            print_f("登录成功\n");
        }
    } else {
        print_f("登录成功(缓存)\n");
    }
}
print_f("共登录成功 " . count($userList) . " 个账号.\n\n");


// 创建每个账号的文章发布列队
print_f("生成发布文章列队...\n");
foreach ($userList as $userName => $userInfo) {
    $time = rand($interTimeMin, $interTimeMax);
    $data = strtotime("+{$time} seconds");

    $processList[] = array('time' => $data, 'userName' => $userName);
    print_f("[加入列队] 发布时间: " . date('Y-m-d H:i:s', $data) . " 账号: {$userName}\n");

    // 初始化一些其他数据
    $userList[$userName]['addPostNum'] = 1;
}

// 处理列队里面的数据
print_f("\n开始处理列队...\n");

while (count($processList) > 0) {
    print_f("[列队数量] " . count($processList) . "\n");

    // 对列队时间排序
    uasort($processList, function ($a, $b) {
        return $a['time'] - $b['time'];
    });

    // 取出第一个成员
    $process = array_shift($processList);
    $userName = $process['userName'];

    print_f("[处理列队] 下次任务时间: " . date('Y-m-d H:i:s', $process['time']) . " 当前时间: " . date('Y-m-d H:i:s') . " 执行账号: {$userName}\n");

    // 计算需要延迟多久
    if ($process['time'] > time()) {
        $sleep = $process['time'] - time();
        print_f("[列队等待] 还需等待 {$sleep}s\n");
        sleep($sleep);
    }

    //**** 发布文章流程 ****//

    // 随机一个栏目
    $column_id = array_rand($userList[$userName]['columnList']);
    $columnInfo = $userList[$userName]['columnList'][$column_id];

    print_f("[发布文章] {$userName} 的栏目 <{$columnInfo['name']}>\n");

    // 获取一个文章库标示
    if (is_string($columnInfo['mark'])) {
        $columnInfo['mark'] = explode(',', $columnInfo['mark']);
        $userList[$userName]['columnList'][$column_id]['mark'] = $columnInfo['mark'];
    }
    $mark_id = array_rand($columnInfo['mark']);
    $markName = $columnInfo['mark'][$mark_id];

    // 获取文章
    print_f("[文章标记] {$markName} , 获取文章...\n");
    $postArr = getDalArticle($markName);
    $postInfo = $postArr['0'];

    // 获取标题关键词
    $keyListDir = dirname(__FILE__) . '/keylist/' . $columnInfo['key'];
    $postKeyword = getFileKeyword($keyListDir);

    // 字符串替换
    $postInfo['body'] = postBodyReplace($postInfo['body'], $userList[$userName]['hosType'], $postKeyword);

    // 末尾追加发布时间
    $postInfo['body'] .= date('YmdHis');

    // 发布一篇文章
    $options = array(
        'oInp0' => getRandImg(dirname(__FILE__) . '/imglist/' . $columnInfo['img'])
    );

    $addPostRet = $userList[$userName]['b2bObj']->postAdd($postKeyword, $postInfo['body'], $columnInfo['class'], $column_id, $options);
    file_put_contents(dirname(__FILE__) . '/post.html', "{$postKeyword}<hr />{$postInfo['body']}");

    // 判断是否发布成功
    $isNextAdd = true;
    if ($addPostRet) {
        print_f("[发布成功] 账号: {$userName} 第 {$userList[$userName]['addPostNum']} 篇 <{$postKeyword}>\n");
        $userList[$userName]['addPostNum']++;

        //限定每个账号每天只能发40篇文章
        if ($userList[$userName]['addPostNum'] > 40) $isNextAdd = false;
    } else {
        $errorMsg = $userList[$userName]['b2bObj']->getErrorMsg();
        if ($errorMsg == '操作频繁') $isNextAdd = false;
        print_f("[发布失败] 账号: {$userName} 错误原因: {$errorMsg}\n\n");

        //更新关键词附表的（ID）标识-1
        modityKeyId($keyListDir);
    }

    // 创建下次发布时间
    if ($isNextAdd) {
        $time = rand($interTimeMin, $interTimeMax);
        $data = strtotime("+{$time} seconds");

        $processList[] = array('time' => $data, 'userName' => $userName);
        print_f("[加入列队] 发布时间: " . date('Y-m-d H:i:s', $data) . " 账号: {$userName}\n\n");
    } //停止当前账号的文章发布，并记录当天发布文章的所有链接及标题（关键词）
    else {
        echo "====导出今天发布的所有文章链接及标题===\n";
        $date = date("Y-m-d H:i:s", time());
        $D_flag1 = file_put_contents(POST_URL_KEY_LIST . $userName . ".csv", $date . "\n", FILE_APPEND);
        $D_flag2 = file_put_contents(POST_KEY_LOG . $userName . "_key.csv", "\n" . $date . ",", FILE_APPEND);

        for ($i = 1; $i <= 4; $i++) {
            $postList = $userList[$userName]['b2bObj']->getPostList($i);//获取已发布文章的链接
            if (!empty($postList['info'][0])) {
                //保存已发布的文章的链接和关键词
                $retInfo = $userList[$userName]['b2bObj']->savePostUrl_Title($userName, $postList, $i);
                if ($retInfo === false) print_r("{$userName}··· 第{$i}页的链接及标题未保存完整\n");
                else {
                    print_r("{$userName}··· 第{$i}页的链接及标题已保存至" . POST_URL_KEY_LIST . $userName . ".csv\n");
                    //单独保存已发布的关键词
                    $json_titleList = $retInfo;
                    $ret = $userList[$userName]['b2bObj']->saveKey($userName, $json_titleList);
                    if ($ret) print_r("{$userName}··· 第{$i}页的标题已保存至" . POST_KEY_LOG . $userName . "_key.csv\n");
                    else print_r("{$userName}··· 第{$i}页的标题保存失败\n");
                }
            } else print_r("${userName}··· 获取第{$i}页链接失败\n");
        }
    }
}


// 主动将今天发布的文章链接推送给百度
$day = "今天";
print_f("检查{$day}的连接并主动推送到百度...\n");
foreach ($userList as $userName => $userInfo) {
    $date = date("Y-m-d");
    $all_list = getPostUrlList($userName, $date);
    if (!$all_list) {
        print_r("获取{$day}的文章链接【失败】!!!\n");
        continue;
    }

    // 执行百度推送
    $ret = do_baiduPush($all_list, $userName, $day, $date);
    if ($ret) continue;
}

print_f("[结束]\n");
